package xyz.sekai52799.answer.a401_a600;

public class Question494 {
//    给你一个非负整数数组 nums 和一个整数 target 。
//
//    向数组中的每个整数前添加 '+' 或 '-' ，然后串联起所有整数，可以构造一个 表达式 ：
//
//    例如，nums = [2, 1] ，可以在 2 之前添加 '+' ，在 1 之前添加 '-' ，然后串联起来得到表达式 "+2-1" 。
//    返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
//
//
//
//    示例 1：
//
//    输入：nums = [1,1,1,1,1], target = 3
//    输出：5
//    解释：一共有 5 种方法让最终目标和为 3 。
//            -1 + 1 + 1 + 1 + 1 = 3
//            +1 - 1 + 1 + 1 + 1 = 3
//            +1 + 1 - 1 + 1 + 1 = 3
//            +1 + 1 + 1 - 1 + 1 = 3
//            +1 + 1 + 1 + 1 - 1 = 3
//    示例 2：
//
//    输入：nums = [1], target = 1
//    输出：1
//
//
//    提示：
//
//    1 <= nums.length <= 20
//    0 <= nums[i] <= 1000
//    0 <= sum(nums[i]) <= 1000
//    -1000 <= target <= 1000

    private int result;
    public int findTargetSumWays(int[] nums, int target) {
        this.result = 0;
        dp(nums, target, true, 0, 0);
        dp(nums, target, false, 0, 0);
        return result/2;
    }

    // plusOrMinus: true为加号,false为减号
    private void dp(int[] nums,int target, boolean plusOrMinus, int depth, int current) {
        if (depth == nums.length) {
            if (current == target) {
                this.result++;
            }
            return;
        }

        int temp = 0;
        if (plusOrMinus) {
            temp = nums[depth];
        } else {
            temp = -nums[depth];
        }
        dp(nums, target, true, depth+1, current+temp);
        dp(nums, target, false, depth+1, current+temp);
    }
}
